package org.real.guetshop.controller.general;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;

@RestController
@Slf4j
@RequestMapping("/subscribe/{merchantId}")
public class SSEController {

//    @Resource
//    private RedisTemplate<String ,Object> redisTemplate;

    // 使用线程安全的映射存储每个商家ID对应的SseEmitter实例
    private ConcurrentHashMap<Integer, SseEmitter> merchantEmitters = new ConcurrentHashMap<>();


    //定义一个请求端点，用于客户端建立SSE连接
    @GetMapping("/see")
    public SseEmitter connect(@PathVariable Integer merchantId) {

        //创建一个新的SseEmitter实例，设置超时时间为Long.MAX_VALUE
        SseEmitter sseEmitter = new SseEmitter(Long.MAX_VALUE);

        // 连接成功需要返回数据，否则会出现待处理状态
        try {
            sseEmitter.send(SseEmitter.event().comment("welcome"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //将这个实例和商家id关联起来
        merchantEmitters.put(merchantId, sseEmitter);
        log.info("SSE实例和商家ID关联列表:{}",merchantEmitters);

        //当连接完成的时候（比如客户端关闭连接），则移除相对应的实例
        sseEmitter.onCompletion(() ->{
            merchantEmitters.remove(merchantId);
            log.info("{}断开连接......", merchantId);
        });

        //连接超时的时候也移除相对应的实例
        sseEmitter.onTimeout(() -> merchantEmitters.remove(merchantId));

        // 连接报错
        sseEmitter.onError((throwable) -> {
            merchantEmitters.remove(merchantId);
        });

        //返回SseEmitter实例给客户端，客户端将通过这个实例接收服务器推送的消息
        return sseEmitter;
    }

    // 这个方法用于向特定商家发送消息
    public void sendMessageToMerchant(Integer merchantId, Object message) {
        // 从映射中获取与商家ID关联的SseEmitter实例
        SseEmitter emitter = merchantEmitters.get(merchantId);
        if (emitter != null) {
            try {
                // 使用SseEmitter发送消息，这里将消息对象转换为JSON格式
                emitter.send(SseEmitter.event().data(message));
            } catch (IOException e) {
                // 如果发送失败，记录错误并结束这个SseEmitter实例
                emitter.completeWithError(e);
            }
        }
    }
}
